// -----------------------------------------------	//
// 定数定義                                      		//
// -----------------------------------------------	//
// 画面サイズ
const SCREEN_WIDTH = 500;
const SCREEN_HEIGHT = 500;
// オブジェクトタイプの定数定義
const OBJ_TYPE_NONE		= 0;
const OBJ_TYPE_STAGE	= (1<<0);
const OBJ_TYPE_BALL		= (1<<1);
const OBJ_TYPE_BAR		= (1<<2);
const OBJ_TYPE_BLOCK	= (1<<3);
const OBJ_TYPE_OTHER	= (1<<4);
//-----------------------------------------------	//
// グローバル変数                                 		//
//-----------------------------------------------	//
var edge_key = 0;
var pls_key = 0;
var pls_prev = 0;
var key_conf = new Array(
		37,		// left
		39,		// right
		13,		// Enter
		65,		// a
		83,		// s
		68,		// d
		null
);

var test_count = 0;
//-----------------------------------------------	//
// 汎用クラス                                   		//
//-----------------------------------------------	//
var Pos = function(x, y) {
	this.x = x;
	this.y = y;
	
	// 衝突判定用
	this.r = 0;
	this.s = 0;
}
var Rect = function(x, y, w, h) {
	this.x = x;
	this.y = y;
	this.w = w;
	this.h = h;
}
// -----------------------------------------------	//
//汎用メソッド                                   		//
//-----------------------------------------------	//
//function hc_line_line(mpx, mpy, mnx, mny, opx, opy, onx, ony) {
//	// チェックその１
//	var S,T,D;		// 一時変数を宣言
//	// 分母を先に計算。計算量を減らすため、分子は後で行う。
//	D = (opx - mpx) * (ony - mpy) - (opy - mpy) * (onx - mpx);
//	// Dの符号に応じて分岐
//	if (D < 0) {
//		S = (ony - mpy) * (mnx - mpx) - (onx - mpx) * (mny - mpy);
//		T = (opx - mpx) * (mny - mpy) - (opy - mpy) * (mnx - mpx);
//		return (S<=0 && T<=0 && (S+T)/D >= 1)?true:false;
//	} else if (D > 0) {
//		S = (ony - mpy) * (mnx - mpx) - (onx - mpx) * (mny - mpy);
//		T = (opx - mpx) * (mny - mpy) - (opy - mpy) * (mnx - mpx);
//		return (S>=0 && T>=0 && (S+T)/D >= 1)?true:false;
//	}
//	// D=0 の時には、点が線分の上かどうかを判定する。
//	return ((opx - mpx) * (onx - mpx) + (opy - mpy) * (ony - mpy) <= 0 ||
//			(opx - mnx) * (onx - mnx) + (opy - mny) * (opy - mny) <= 0 ||
//			(mpx - opx) * (mnx - opx) + (mpy - opy) * (mny - opy) <= 0)?true:false;
//}
function hc_line_line(A, B, C, D, R) {
	// 省略された変数名
	// m = my	o = operate
	// p = prev	n = next
	
	// チェックその２
	var bunbo = (B.x - A.x) * (D.y - C.y) - (B.y - A.y) * (D.x - C.x);
	
	// 平行チェック
	if ( bunbo == 0) { return false;}
	
	var AC = new Pos(0, 0);
	AC.x = C.x - A.x;	AC.y = C.y - A.y;
	
	var r, s;
	r = ((D.y - C.y) * AC.x - (D.x - C.x) * AC.y) / bunbo;
	s = ((B.y - A.y) * AC.x - (B.x - A.x) * AC.y) / bunbo;
	
//	if (r * r + s * s < 3) {
//		// わりかし近め
//		var a = 5;
//		a++;
//	}
	ren = 0;		// 2点間の距離を測定
	if (R > 1) {
		ren = (A.x - B.x) * (A.x - B.x) +　(A.y - B.y) *　(A.y - B.y);
		ren =　R / Math.sqrt(ren);
	}
	r -= ren;
	var ret = new Pos(	A.x + r * (B.x - A.x),
			A.y + r * (B.y - A.y));
	if (r >= 0 && r <= 1 &&
		s >= 0 && s <= 1) {
		ret.r = r;	ret.s = s;
		return ret;
	} else {
		return false;
	}
}

function hc_rect_rect(MY, OP) {
	if(
		(MY.x <= OP.x+OP.w && MY.x+MY.w >= OP.x)
		&&
		(MY.y <= OP.y+OP.h && MY.y+MY.h >= OP.y)
	){
		return true;
	}else{
		return false;
	}
}